package com.javabase.study.CommonUsedClasses;

/**
 * TODO
 * 内容：测试学习包装类
 * 作者:jxx
 * 创建时间：2021/6/29
 */
public class TestWrapperClass {
    public static void main(String[] args){

        testWrapperMethod();
       // testBoxing();
        testIntegerCache();
    }

    /**
     * 包装类 基本数据类型  和字符串之间的常规操作
     */
    public static void testWrapperMethod(){
        Integer i = new Integer(4);
        Integer j = new Integer(5);

        System.out.println(i.toString());
        System.out.println(j);

        // 基本类型转换成Integer对象
        Integer int1 = new Integer(10);
        // 基本数据类型转对象的官方推荐操作
        Integer int2 = Integer.valueOf(20);

        // Integer对象转换成int类型
        int  a = int1.intValue();
        System.out.println(a);

        // 字符串转换成Integer对象
        Integer int3 = Integer.parseInt("334");
        System.out.println(int3);
        Integer int4 = new Integer("445");
        System.out.println(int4);

        // Integer对象转成字符串
        String str1 = int4.toString();
        System.out.println(str1);

        // 一些常见int类型相关的常量
        System.out.println("int能表示的最大整数：" + Integer.MAX_VALUE);
    }

    /**
     * 所谓装箱拆箱，实际上是一种编译器蜜糖，编译器会自动根据场景实现
     * 基本类型和对应类型的转换
     */
    public static void testBoxing(){
        Integer a = 4;//此处实际上是调用了Integer.valueOf()方法
        int b = a;//此处实际上调用的是a.intValue() 方法
        System.out.println(a.toString());
        System.out.println(b);

        Integer i = null;//null调用对象的方法或者属性会报出空指针异常(NPE)
        int j = i;
        System.out.println(j);
    }

    /**
     * Integer类会在初始化的时候 将[-128,127]之间的数创建好对象方到一个数组里
     * 当外界调用实例化Integer对象时会先判断其值是否在这个区间内，如果在则返回在
     * 数据中这个数值的引用 因此才有 int5 == int6 结果为true
     * 此外，这这种方式时设计模式的一种 叫做享元模式
     */
    public static void testIntegerCache(){
        Integer int5 = 5;
        Integer int6 = Integer.valueOf(5);

        Integer int8 = 128;
        Integer int9 = Integer.valueOf(128);

        System.out.println(int5 == int6);
        System.out.println(int8 == int9);
    }
}
